package handlers

import (
	"goserver/utils"
	"io"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"time"
)

type FileHandler struct {
	uploadDir string // 上传文件保存目录
}

func NewFileHandler(uploadDir string) *FileHandler {
	// 确保上传目录存在
	if err := os.MkdirAll(uploadDir, 0755); err != nil {
		panic("创建上传目录失败: " + err.Error())
	}
	return &FileHandler{uploadDir: uploadDir}
}

func (h *FileHandler) Upload(w http.ResponseWriter, r *http.Request) {
	// 限制最大上传大小（示例设为10MB）
	if err := r.ParseMultipartForm(10 << 20); // 10MB
	err != nil {
		http.Error(w, "文件过大（最大10MB）", http.StatusBadRequest)
		return
	}
	// 获取文件表单字段（假设前端使用"file"作为字段名）
	file, header, err := r.FormFile("file")
	if err != nil {
		http.Error(w, "未找到上传文件", http.StatusBadRequest)
		return
	}
	defer file.Close()
	// 生成唯一文件名（避免覆盖）
	ext := filepath.Ext(header.Filename)
	//获取除了文件类型.前面的的文件名
	baseName := filepath.Base(header.Filename)
	pureName := strings.TrimSuffix(baseName, ext) // 去掉扩展名，得到 "tt"
	newFilename := pureName + "_" + time.Now().Format("20060102150405") + ext
	savePath := filepath.Join(h.uploadDir, newFilename)
	// 保存文件
	out, err := os.Create(savePath)
	if err != nil {
		http.Error(w, "保存文件失败", http.StatusInternalServerError)
		return
	}
	defer out.Close()
	_, err = io.Copy(out, file)
	if err != nil {
		http.Error(w, "写入文件失败", http.StatusInternalServerError)
		return
	}
	// 返回成功信息（包含文件访问路径）
	utils.Response(w, 200, "文件上传成功", map[string]string{
		"filename": newFilename,
		"path":     "/public/" + newFilename, // 假设通过/static/uploads访问
	})
}
